# This script imports .asc trace to multiple spreadsheets

# required packages
require 'spreadsheet'
require 'xmlsimple'
require 'GenericChannelInterpreter'

# Script Constants
MAX_EXCEL_ROWS = 65535
FILTER_MESSAGES_DELIMITER = " "
SIGNAL_ID_INDEX = 2

# configuration xml file name
CONFIG_FILE_NAME = 'import_config.xml'

##########################################################################################################
# creates a new workbook and returns its object
##########################################################################################################
def get_new_workbook
  book = Spreadsheet::Workbook.new
  return book
end

##########################################################################################################
# creates a new worksheet and returns its object
##########################################################################################################
def get_new_worksheet(workbook)
  return workbook.create_worksheet
end

##########################################################################################################
# writes a row to the workbook at a given rowindex
##########################################################################################################
def write_row_to_workbook(worksheet, row_index, line)
  worksheet.row(row_index).concat(line.to_s.split)
end

##########################################################################################################
# reads input asc file line by line
##########################################################################################################
def write_workbook(input_filename, filter_messages)
  row_index = 1
  worksheet_index = 0
  worksheets = []

  new_workbook = get_new_workbook
  new_worksheet = get_new_worksheet(new_workbook)
  worksheets.push(new_worksheet)
  new_worksheet.name = "Sheet"+worksheets.count.to_s
  interpreter = GenericChannelInterpreter.new()

  File.readlines(input_filename).each do |packet|

    worksheet_index = row_index / MAX_EXCEL_ROWS

    if worksheet_index == worksheets.count
      new_worksheet = get_new_worksheet(new_workbook)
      worksheets.push(new_worksheet)
      new_worksheet.name = "Sheet"+worksheets.count.to_s
    end

    # get the signal id to filter
    signal_id = packet.to_s.split[SIGNAL_ID_INDEX]
    filter_messages.collect{|filter_signal| if(filter_signal == signal_id)
        packet_with_interpretation = interpreter.process(signal_id,packet)
        write_row_to_workbook(worksheets[worksheet_index], row_index % MAX_EXCEL_ROWS, packet_with_interpretation)
        row_index += 1
      end
    }

  end

  return new_workbook

end

##########################################################################################################
# Read Configurations and Route the packets
##########################################################################################################

# Get the configuration values
config = XmlSimple.xml_in(CONFIG_FILE_NAME)
import_filename = config['src_file'][0].strip
export_filename = config['dest_file'][0].strip
filter_messages = config['filters'][0].strip.split(FILTER_MESSAGES_DELIMITER)

# Create the packet interpreter router object
interpreter = GenericChannelInterpreter.new()

new_workbook = nil

if (import_filename != nil)
  new_workbook = write_workbook(import_filename, filter_messages)
  puts "Wait while the excel file is being written"
  new_workbook.write export_filename
  puts "Writing Done!!!"
else
  puts "ASCII file not found"
  exit
end
